<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // JavaScript 所有数字都保存成 64 位浮点数，这给数值的表示带来了两大限制。一是数值的精度只能到 53 个二进制位（相当于 16 个十进制位），大于这个范围的整数，JavaScript 是无法精确表示，这使得 JavaScript 不适合进行科学和金融方面的精确计算。二是大于或等于2的1024次方的数值，JavaScript 无法表示，会返回Infinity。

    // 小结:
    // (1) 超出2的53次方的数,无法精确表示
    // (2) 大于或等于2的1024次方的数,无法表示,会返回Infinity。

    // console.log(Math.pow(2, 53));
    // console.log(Math.pow(2, 53) + 1);
    // console.log(Math.pow(2, 53) + 2);
    // console.log(Math.pow(2, 53) + 3);

    // console.log(Math.pow(2,1024));  // Infinity

    // ES6新增 ** 运算符  m**n => m^n次方
    // console.log(2 ** 53);
    // console.log(2 ** 53 + 1);
    // console.log(2 ** 53 + 2);
    // console.log(2 ** 53 + 3);


    // ES2020 引入了一种新的数据类型 BigInt（大整数），来解决这个问题，这是 ECMAScript 的第八种数据类型。BigInt 只用来表示整数，没有位数的限制，任何位数的整数都可以精确表示。

    // 如何创建BigInt数据
    // (1)  字面量表示法
    var a = 2n;
    var b = 53n;

    console.log(a,b, typeof a);  //'bigint' 

    // (2) 通过BigInt()函数 将number类型转化为 bigInt
    console.log(BigInt(2));
    console.log(BigInt(53));

    // console.log(Math.pow(2n,53n));  // 报错:  Cannot convert a BigInt value to a number  (Math.pow()只适用于number类型,不适用于bigInt)

    console.log(2n ** 53n);
    console.log(2n ** 53n + 1n);
    console.log(2n ** 53n + 2n);
    console.log(2n ** 53n + 3n);

    console.log(2n ** 1024n);


    document.write(2n ** 1024n + "<br>")
    document.write(2n ** 1024n + 1n + "<br>")


    // BigInt 转 number类型
    console.log(Number(2n));
    console.log(Number(53n));
    console.log(String(2n ** 1024n));


    // ?. 链判断运算符
   var zhang = {
        name:"张三",
        age:18,
        height:"177cm",
        weight:"60cm",
        grade:{
            chinese:55,
            math:66,
            english:77
        }
    }

    // console.log(zhang.grade.chinese);

    // 如果有grade => 就访问grade下的chinese,否则返回undefined

    // var result = null; 
    // if(zhang.grade){
    //     result = zhang.grade.chinese;
    // }else{
    //     result = zhang.grade; // undefiend
    // }
    // console.log(result);

    // 升级版
    // var result = zhang.grade && zhang.grade.chinese;


    // ?. 链判断运算符

    // var result = zhang?.grade?.chinese
    


    console.log(zhang.say?.());  // zhang.say如果存在则调用, 否则就返回undefined



    e || window.event;

    if(user && pwd && email &&phone){

    }







</script>

</html>